﻿using Autofac;
using Autofac.Extensions.DependencyInjection;
using NETCORE.Autofac.Service;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using AutofacIn = Autofac;//给引入的Autofac重命名，因为与命名空间 【NETCORE.Autofac】名称重复了

namespace NETCORE.Autofac
{
    public class AutofacModuleRegister : AutofacIn.Module
    {
        //重写Autofac管道Load方法，在这里注册注入
        protected override void Load(ContainerBuilder builder)
        {
            //注册Service中的对象,Service中的类要以Service结尾，否则注册失败
            builder.RegisterAssemblyTypes(GetAssemblyByName("NETCORE.Autofac.Service")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces();
            //注册Repository中的对象,Repository中的类要以Repository结尾，否则注册失败
            builder.RegisterAssemblyTypes(GetAssemblyByName("NETCORE.Autofac.Repository")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces();

            //单独注册
            builder.RegisterType<WxPayService>().Named<IPayService>(typeof(WxPayService).Name);
            builder.RegisterType<AliPayService>().Named<IPayService>(typeof(AliPayService).Name);

            ////注入的生命周期
            //builder.RegisterType<WxPayService>().As<IPayService>();//暂存生存期
            //builder.RegisterType<WxPayService>().As<IPayService>().InstancePerLifetimeScope();//范围生存期
            //builder.RegisterType<WxPayService>().As<IPayService>().SingleInstance();//单例生存期


        }  


        /// <summary>
        /// 根据程序集名称获取程序集
        /// </summary>
        /// <param name="AssemblyName">程序集名称</param>
        /// <returns></returns>
        public static Assembly GetAssemblyByName(String AssemblyName)
        {
            return Assembly.Load(AssemblyName);
        }
    }
}
